package com.zy.pay.api.util;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSONObject;

/**
 * 
 *
 * @author: zengdq
 * @since: 2020年1月15日  下午4:44:38
 * @history:
 */
public class ZyPayUtil {

    private static final Logger logger          = LoggerFactory.getLogger(ZyPayUtil.class);

    public static final String  PARAM_SIGN      = "sign";

    public static final String  PARAM_STARTWITH = "t_";

    public static final String  PARAM_SPLIT     = "|";

    /**
     * 获取签名
     *
     * @param jsonObject     传递的参数
     * @param signKey 签名密钥
     * @return
     * @create 2018年4月26日 上午10:22:15 panweiqiang
     * @history
     */
    public static String getSign(JSONObject jsonObject, String signKey) {
        // 根据KEY排序
        Map<String, String> sortedParamMap = new TreeMap<>();
        for (String key : jsonObject.keySet()) {
            if (key.equals(PARAM_SIGN) || key.startsWith(PARAM_STARTWITH) || jsonObject.get(key) == null) {
                // 略过sign和以t_开头的参数
                continue;
            }
            sortedParamMap.put(key, urlDecoder(jsonObject.getString(key), StandardCharsets.UTF_8));
        }
        // 最终结果
        List<String> allList = new LinkedList<String>();
        for (String value : sortedParamMap.values()) {
            if (StringUtils.isNotBlank(value)) {
                allList.add(value);
            }
        }
        // 添加签名key
        allList.add(signKey);
        String params = StringUtils.join(allList.iterator(), PARAM_SPLIT);
        String signOne = Md5Util.msgMd5(params);
        String secondParams = new StringBuilder().append(signOne).append(PARAM_SPLIT).append(signKey).toString();
        String signTwo = Md5Util.msgMd5(secondParams);
        return signTwo;
    }

    /**
     * url解码
     * @param url
     * @param charSet
     * @return
     * @create  2018年4月14日 下午3:22:20 panweiqiang
     * @history
     */
    private static String urlDecoder(String url, Charset charSet) {
        try {
            return URLDecoder.decode(url, charSet.name());
        } catch (UnsupportedEncodingException e) {
            return null;
        }
    }

}
